/*
 *  Test the 32-bit fast path which applies to integers in the
 *  range [-2**32-1,2**32-1], in any radix.
 *
 *  The test is not exhaustive but has a pretty large (prime)
 *  skip; both endpoint values are always included though.
 */

/*---
{
    "slow": true
}
---*/

/* FIXME: util */
/* Trivial string checksum used to summarize brute force output lines
 * (minimizes test case size).
 */
function checkSumString(x) {
    var i, n;
    var res = 0;
    var mult = [ 1, 3, 5, 7, 11, 13, 17, 19, 23 ];

    n = x.length;
    for (i = 0; i < n; i++) {
        res += x.charCodeAt(i) * mult[i % mult.length];
        res = res >>> 0;  // coerce to 32 bits
    }

    return res;
}

/*===
radix 2
179306267
178417689
172469437
158113487
164522390
171053804
173839346
73212146
radix 3
120001562
116340620
114838710
104289556
107366288
110915012
112538566
49058085
radix 4
93996707
93956672
93119252
85264205
87138494
90633905
90749467
38267839
radix 5
85524532
85420528
83386734
75416390
76399706
79977948
80054256
33672687
radix 6
80375401
79136945
75214944
69706448
69994308
72423839
75586644
31904527
radix 7
75660318
75401474
70356910
65459640
64698752
68090646
70718420
29706955
radix 8
70760327
70625152
69485827
61898015
62283468
65132380
65228960
27580869
radix 9
69419812
65527610
65200854
59988264
60261022
60887826
62388478
27476559
radix 10
65687102
65545878
64772404
57882489
57783900
60948995
61112511
25716773
radix 11
69166623
68000038
64211306
59710995
59000300
61402648
64314472
27317298
radix 12
67632900
67294827
66690879
60164747
60799276
62204906
62065132
26522442
radix 13
69740341
69516644
68895103
62262756
60104065
64690764
64292443
27542684
radix 14
71598398
72081748
68929359
62685443
57389876
65748807
66567837
28755782
radix 15
72430006
71848282
67985208
62706717
58859470
59698249
66875878
28526129
radix 16
73769135
70397366
68140205
62925422
60428538
60547551
60928624
25686087
radix 17
70912771
69704402
69358933
64554822
58820477
61931012
61985987
26129087
radix 18
71231524
71051252
70966883
62227667
69575090
63280736
63297516
26699407
radix 19
72743265
71638726
71595990
62378229
61170069
64639168
64361287
27150427
radix 20
73544332
73219218
69908335
62933335
65249346
65680945
65650006
27355150
radix 21
73704427
73519719
70395924
63441542
63940685
72906696
67058764
27766841
radix 22
75433924
74338906
67871773
64092473
63565508
66619708
67094279
28763924
radix 23
73850335
69301782
68368528
64488785
63024653
68066056
66847488
28551783
radix 24
70204641
70017694
68737246
64845718
63541335
66918926
69254539
29132129
radix 25
70855845
70301783
69537281
64991486
64441155
65518746
69378566
29362760
radix 26
71640896
70461614
70154774
65236955
64792347
65106858
68281845
29798072
radix 27
71552515
71030799
70959577
65368358
65244965
65649571
65944648
29468067
radix 28
71962251
71587113
71715547
65252620
65591519
66057948
66957378
28114849
radix 29
72491759
72457349
72335730
64922366
65489259
66863734
67087226
28487426
radix 30
73411662
72922686
72917156
64750239
66035368
67029068
67666075
28850587
radix 31
73970452
73659060
73152390
64581272
65701329
68585956
67311642
29290105
radix 32
74485135
74394511
73420892
64549058
65141537
68639239
68711056
29925749
radix 33
74926889
74885711
72847827
64654882
65104908
69566120
69322629
27930453
radix 34
75281549
76214857
72254342
64501263
65445833
68521664
69218983
30036608
radix 35
75808277
75869094
72102173
64555847
65319460
67574813
71497041
28178381
radix 36
77635113
75194087
72176214
64588163
65418360
67316650
71241876
30814244
===*/

function fastPathTest() {
    var start = -256*256*256*256 + 1;
    var end = 256*256*256*256 - 1;
    var step = 115757;  // prime
    var i;
    var radix;
    var tmp = [];

    function flush() {
        if (tmp.length > 0) {
            // Note: here we're printing a checksum which is a small integer,
            // so the checksum will go through the same fast path.
            print(checkSumString(tmp.join(' ')));
            tmp.length = 0;
        }
    }

    function f(x) {
        tmp.push(x);
        if (tmp.length >= 10000) {
            flush();
        }
    }

    for (radix = 2; radix <= 36; radix++) {
        print('radix', radix);
        i = start;
        for (;;) {
            f(new Number(i).toString(radix));

            if (i >= end) {
                break;
            }
            i += step;
            if (i >= end) {
                i = end;  // always include end
            }
        }
        flush();
    }
}

try {
    fastPathTest();
} catch (e) {
    print(e);
}
